/*
    封装请求工具--utils--request.js
    1 初始化 axios 实例
    2 请求拦截器 头部 带上 token
    3 响应拦截器 拿出响应数据 拦截失效 token
    4 导出 axios 实例--函数形式--返回 Promise
*/
import axios from 'axios'
import router from '@/router'
import { useUser } from '@/stores/modules/userStore'

// 导出 URL  其他不是通过axios 请求的地址 使用这个
export const baseURL = import.meta.env.VITE_APP_API_BASE_URL

// 1 创建 axios实例
const instance = axios.create({
	baseURL,
	timeout: 5000,
})
// 2 axios   拦截器
// 请求 成功  失败   发请求之前拦截
// 拦截后一定要返回出去  config 不然下以后的axios就无法获取config
instance.interceptors.request.use(
	config => {
		// 1 config.headers config.url 等处理 config

		// 如果本地存在token  就携带token
		// 1获取用户信息 对象
		const { user: userState } = useUser()
		const { token } = userState
		// 2判断是否有token
		if (token) {
			// 3携带token
			// config.headers.Authorization = `Bearer ${token}`
			config.headers['X-Access-Token'] = token
		}

		if (config.method === 'get') {
			if (config.url.indexOf('sys/dict/getDictItems') < 0) {
				config.params = {
					_t: Date.parse(new Date()) / 1000,
					...config.params,
				}
			}
		}

		return config
	},
	err => Promise.reject(err)
)

const err = error => {
	if (error.response) {
		// const data = error.response.data
		switch (error.response.status) {
			case 403:
				/* 	Vue.prototype.$Jnotification.error({
					message: '系统提示',
					description: '拒绝访问',
					duration: 4,
				}) */
				console.log('拒绝访问')
				break
			case 500:
				console.log('blob')
				break
			case 404:
				console.log('很抱歉，资源未找到!')
				break
			case 504:
				console.log('网络超时')
				break
			case 401: {
				// 1清除缓存 2重新登录
				const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
				router.push(`/user/login?redirectUrl=${fullPath}`)
				break
			}
			default:
				console.log('最后')
				break
		}
	} else if (error.message) {
		if (error.message.includes('timeout')) {
			console.log('网络超时')
		} else {
			console.log('系统提示')
		}
	}
	return Promise.reject(error)
}

// 3 响应 成功  失败   回调函数  数据返回之前拦截
instance.interceptors.response.use(
	//  最后返回出去 处理后的v  后台数据
	v => v.data,
	/* e => { */
	/*
		    token 验证失败 且是401 携带当前路由进入登录页,登陆成功返回当前页
		    401 进入该函数
         1 清空无效用户信息
         2 跳转到登录页面
         3 跳转到登录页面 应携带当前路由地址 以便跳回  取 route.query.redirectUrl
				 组件中‘/user?a=10&b=1’ $route.path === /user   携带数据丢失
				                   $route.fullPath === /user?a=10
				 router.currentRoute 是 ref响应式 数据  .value
				 ? & 等特殊字符要转码 encodeURIComponent  防止解析地址错误
      */
	/*
    	if (e.response && e.response.status === 401) {
			store.commit('user/setUser', {})
			const fullPath = encodeURIComponent(router.currentRoute.value.fullPath)
			router.push(`/login?redirectUrl=${fullPath}`)
		}
		return Promise.reject(e)
    */
	/* } */
	err
)

/*
   4 返回 promise
   请求地址 请求方式 请求数据
   1 get params 来提交 submitData
   2 post data 提交 submitData
   { [ 可写 表达式 ] : value} 动态 key
    get Get  GET   统一转为小写 toLowerCase()
*/
export default (url, submitData, method = 'GET') =>
	// 3 发送网络请求   返回一个 fulfill 状态的axios
	// 即promise  v.data  为服务器返回数据 v包含6个
	instance({
		method,
		url,
		[method.toLowerCase() === 'get' ? 'params' : 'data']: submitData,
	})
